package com.duoduo.common.util.anno.method;

import com.duoduo.common.api.constants.Constant;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * @Auther: duoduo
 * @Date: 2022/8/26 11:12
 * @Description: Lock分布式锁注解
 * 添加此注解后，在方法上添加分布式锁
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Lock {

    /**
     * 当配置了多个集群时，可以指定使用哪个前缀的集群；单个集群的不用改
     *
     * @return
     */
    String prefixName() default Constant.LOCK_DEFAULT_PRE_NAME;

    /**
     * 获取锁的超时时间，默认3秒，等于0则立即返回，小于0则一直等待
     *
     * @return
     */
    int timeOut() default 3;

    /**
     * 是否业务执行完成后释放锁，默认true
     *
     * @return
     */
    boolean release() default true;

    /**
     * 可以手动指定获取requestId的spel表达式，也可以手动传到threadlocal里，用于锁重入
     *
     * @return
     */
    String requestId() default Constant.EMPTY_STRING;

    /**
     * key的生成规则
     *
     * @return
     */
    KeyRule keyRule() default @KeyRule;

    /**
     * 如果timeOut大于0，加锁超时后是返回加锁失败（timeOutThenExecBussiness=false）还是执行业务（timeOutThenExecBussiness=true）
     *
     * @return
     */
    boolean timeOutThenExecBussiness() default false;
}
